package simulacion.control.pruebas;

import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import simulacion.control.PrimerRegistradoMayorPrioridad;

import compartido.ITransaccion;

public class TestRegistrarTiposHeredados {

	PrimerRegistradoMayorPrioridad comparador;
	
	/**
	 * Las clases usadas para las pruebas son una simple herencia:
	 *  - Existe una clase extremidad, y dos hijas de la misma llamadas mano y pie.
	 */	
	public class extremidad implements ITransaccion {
		int prioridad;
		
		public extremidad () {
			prioridad = 0;
		}
		
		public extremidad (int prioridad) {
			this.prioridad = prioridad;
			// TODO Auto-generated constructor stub
		}
		@Override
		public int getPrioridad() {
			return prioridad;
		}
		@Override
		public int activar() { return 0; }
	}
		
	public class mano extends extremidad {};
	public class pierna extends extremidad {};
	
	@Before
	public void setUp() throws Exception {
		comparador = new PrimerRegistradoMayorPrioridad();
	}

	@After
	public void tearDown() throws Exception {
		comparador = null;
	}

	@Test
	public void testGetPrioridadInexistente() {

		int prioridad = comparador.getPrioridad(new extremidad());
		
		if (prioridad != comparador.minimaPrioridad())
			fail ("Falla al buscar una prioridad que no existe (comparador vacio).");
		
		comparador.registrar(mano.class);
		prioridad = comparador.getPrioridad(new extremidad());
		if (prioridad != comparador.minimaPrioridad())
			fail ("Falla al buscar una prioridad que no existe (registro hijo y busco el padre).");
		
	}
		
	@Test
	public void testGetPrioridadExistente() {
		comparador.registrar(extremidad.class);
		int prioridad = comparador.getPrioridad(new pierna());
		
		if (prioridad == comparador.minimaPrioridad())
			fail ("Falla al buscar una prioridad existente (registro el padre y busco el hijo)");
	}
	
	@Test
	public void testCompararInstancias() {

		extremidad e10 = new extremidad(10);
		extremidad e20 = new extremidad(20);
		
		comparador.registrar(extremidad.class);
		
		if (comparador.comparar(e20, e10) >= 0)
			fail ("Falla al definir la prioridad de dos instancias de prioridades diferentes");
	}
	
	@Test
	public void testGetPrioridad() {
		comparador.registrar(extremidad.class);
		comparador.registrar(pierna.class);
		
		int pA = comparador.getPrioridad(new extremidad());
		int pB = comparador.getPrioridad(new mano());
		int pC = comparador.getPrioridad(new pierna());
		
		if (pA != pB)
			fail ("Falla la obtención de prioridad mediante herencia de clases.");

		if (pC >= pA)
			fail ("Falla la asignación de prioridades en orden de inserción.");		
	}

}
